//泛型的上界
public class ClassA <E extends Number>{
    ClassA<Integer> i1;
    //ClassA<String> i2;//报错，只接受Number类及其子类
}

class ClassB<T>{
//未指定上界，默认为<E extends Object>
}

class ClassC<E extends Comparable<E>>{
//此时的E必须为实现Comparable接口
}

//泛型方法
class TestDome<U>{
    //只使用了泛型类定义的类型参数，不是泛型方法
    public void testMethod(U u){
        System.out.println(u);
    }

    //<T>声明此方法为泛型方法
    public <T> T testMethod1(T t){
        return t;
    }
}

//泛型方法中可以同时声明多个类型参数
class TestDome2<U>{
    public <T,S>T testDome2(T t,S s){
        return t;
    }
}

// 泛型方法中也可以使用泛型类中定义的泛型参数
class TestDome3<U>{
    public <T>U testDome2(T t,U u){
        return u;
    }
}

//泛型类中定义的类型参数和泛型方法中定义的类型参数是相互独立
class TestDome4<T> {
    public void TestDome4(T t) {
        System.out.println(t);
    }

    public <T> T TestDome5(T t) {
        return t;
    }
    //这里的类型参数是TestDome5方法签名中声明的类型参数，而不是TestDome4类中的泛型参数。
    //泛型方法始终以自己声明的类型参数为准
}

